﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>IsSet / IsSetRef - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The IsSet operator and IsSetRef function return a non-zero number if the specified variable has been assigned a value." />
<meta name="ahk:equiv-v1" content="AutoHotkey.htm" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

 <h1>IsSet / IsSetRef</h1>

 <p>如果指定变量已经被赋值, 则返回一个非零数字.</p>

<pre class="Syntax">VarIsSet := <span class="func">IsSet</span>(Var)</pre>
<pre class="Syntax">VarIsSet := <span class="func">IsSetRef</span>(Ref)</pre>
<h2 id="Parameters">参数</h2>
<dl>

  <dt>Var</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#variables">变量</a></p>
    <p>一个直接变量引用. 例如: <code>IsSet(MyVar)</code>.</p>
  </dd>
  <dt>Ref</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#variable-references">VarRef</a></p>
    <p>对变量的间接引用. 通常不会像在 <code>IsSetRef(&amp;MyVar)</code> 中那样直接传递, 而是间接传递, 比如在<a href="../Variables.htm#deref">解引用</a>一个 <em>包含</em> VarRef 的参数之前检查它.</p>

 </dl>

 <h2 id="Return_Value">返回值</h2>
<p>类型: <a href="../Concepts.htm#boolean">整数(布尔值)</a></p>
<p>如果 <em>Var</em> 或由 <em>Ref</em> 表示的变量已经被赋值, 则返回值为 1(true), 否则为 0(false).</p>

 <h2 id="Remarks">备注</h2>
<p>使用 IsSet 来直接检查一个变量, 如 <code>IsSet(MyGlobalVar)</code>.</p>
<p>使用 IsSetRef 来检查一个 <a href="../Concepts.htm#variable-references">VarRef</a>, 它通常被一个变量所包含, 如下面的示例所示.</p>
<p>未赋值的变量也称为<a href="../Concepts.htm#uninitialized-variables">未初始化变量</a>. 默认情况下, 试图读取一个未初始化的变量会导致异常抛出. IsSet 可以用来避免这种情况, 例如在第一次使用全局变量或静态变量时是否需要初始化.</p>
<p class="note"><strong>注意:</strong> <a href="../Functions.htm#InitStatic">静态初始化</a> 如 <code>static my_static_array := []</code> 只被计算一次, 即在执行过程中第一次到达时, 因此通常不需要使用 IsSet.</p>
<p>尽管 IsSet 使用了与函数调用相同的语法, 但它可以被认为是一个操作符而不是一个函数. 关键字 <em>IsSet</em> 保留用于此处所示的用法, 不能被重新定义为一个变量或函数. IsSet 不能被间接调用, 因为任何试图传递一个未初始化的变量的行为都会导致错误的产生.</p>
<p>IsSetRef 也可以用来检查一个特定的变量, 通过与<a href="../Variables.htm#ref">引用操作符</a>一起使用. 当以这种方式使用它时, 要注意如果是全局变量需要先<a href="../Functions.htm#Global">声明该变量</a>. 例如, 如果在一个没有声明 <code>global MyVar</code> 的假设-局部函数中使用的话, <code>IsSetRef(&amp;MyVar)</code> 中的 <code>&amp;</code> 会导致 <em>MyVar</em> 默认解析为一个局部变量.</p>

 <h2 id="Related">相关</h2>
<p><a href="../Functions.htm#ByRef">ByRef 参数</a></p>

<h2 id="Examples">示例</h2>
<div class="ex" id="ExBasic">
<p><a class="ex_number" href="#ExBasic"></a> 显示 IsSet 和 IsSetRef 的不同用法.</p>
<pre>
Loop 2
    if !IsSet(MyVar)  <em>; 是否是第一次 "使用" MyVar?</em>
        MyVar := A_Index  <em>; 第一次 "使用" 时进行初始化.</em>
MsgBox Function1(&amp;MyVar)
MsgBox Function2(&amp;MyVar)

Function1(&amp;Param)  <em>; ByRef 参数.</em>
{
    if IsSet(Param)  <em>; 传递 Param 本身, 它是 MyVar 的别名.</em>
        return Param  <em>; ByRef 参数会自动解引用.</em>
    else
        return "unset"
}
Function2(Param)
{
    if IsSetRef(Param)  <em>; 传递包含 VarRef 的 Param.</em>
        return %Param%  <em>; 显式解引用 Param.</em>
    else
        return "unset"
}</pre>
</div>

 </body>
</html>